/* 
 * File:   Memento.h
 * Author: Gab'z
 *
 * Created on 25 mai 2012, 17:43
 */

#ifndef MEMENTO_H
#define	MEMENTO_H

#include <string>

namespace calculator {

    class UndoableRedoableCommand;

    /**
     * Classe de base des Memento. Non instanciable.
     * Les commandes ne l'utilisent pas directement mais passent par ses filles.
     * Les mementos ont en commun l'enregistrement de la std::string 
     * avant le lancement de l'exécution et d'une copie de la commande utilisée.
     * Les classes filles spécialisent les Memento en ajoutant les données 
     * à mémoriser en fonction des commandes utilisées.
     * 
     * Les mementos ne peuvent pas être modifiés au cours de l'exécution du programme,
     * les données supplémentaires qu'ils contiennent ne possèdent pas de getter/setter,
     * elles sont précisées dans les constructeurs spécialisés des classes filles.
     * On utilise le principe des classes amies pour n'autoriser que les commandes
     * concernées à en lire le contenu.
     */
    class Memento {
        friend class CommandManager;
        friend class MementoCaretaker;

    public:

        /**
         * getter InputString.
         * @return la std::string présente avant l'exécution d'une commande.
         */
        std::string getInputString() const {
            return _inputString;
        }

        /**
         * getter UndoableRedoableCommand.
         * @return la commande exécutée et à l'origine du Memento.
         */
        const UndoableRedoableCommand* getUndoableRedoableCommand() const {
            return _undoableRedoableCommand;
        }

    protected:

        /**
         * la std::string présente avant l'exécution d'une commande.
         */
        const std::string _inputString;

        /**
         * la commande exécutée à l'origine du Memento.
         */
        UndoableRedoableCommand* _undoableRedoableCommand;

        /**
         * Constructeur de Memento (protégé).
         * @param undoableRedoableCommand la commande exécutée est copiée
         */
        Memento(UndoableRedoableCommand* undoableRedoableCommand);

        /**
         * Destructeur de Memento
         * Détruit la copie de la commande
         * Seul le CommandManager et le MementoCaretaker peuvent l'utiliser
         */
        virtual ~Memento();
    };
}
#endif	/* MEMENTO_H */

